#include<cstdio>
#include<algorithm>
#include<vector>
#include<map>
#include<cstring>
#define openfile(s) freopen(s".in","r",stdin);freopen(s".out","w",stdout)
using namespace std;
const int N=2e3+1;
const long long MOD=998244353;
long long mod(long long a,long long b=MOD)
{
	a-=a/b*b;
	return a<0?a+b:a;
}
long long pow(long long a,long long b)
{
	long long ret=1;
	a=mod(a);
	for(;b;b>>=1){
		if(b&1) ret=ret*1%MOD;
		a=a*a%MOD;
	}
	return ret;
}
template<class T1,class T2>
void add(T1& a,T2 b)
{
	a+=b;
	if(a>=MOD) a-=MOD;
	return;
}
int n,m;
vector<int> a;
bool check()
{
	for(int i=0;i<n;i++)
		if(a[i]!=i+1)
			return false;
	return true;
}
int ans;
void dfs(int x)
{
	if(x>=m){
		ans+=check();
		return;
	}
	int w=a.front();
	a.erase(a.begin());
	for(int i=0;i<n;i++){
		a.insert(a.begin()+i,w);
		dfs(x+1);
		a.erase(a.begin()+i);
	}
	a.insert(a.begin(),w);
	return;
}
int f[N],t[N];
int fac[N];
map<vector<int>,int> id;
map<int,vector<int>> rid;
vector<int> to[N];
vector<int> change(int x)
{
	vector<int> vis(n,0),ret;
	ret.reserve(n);
	auto get=[&](int k){
		for(int i=0;i<n;i++)
			if(!vis[i]){
				if(!k) return i;
				k--;
			}
		return 0;
	};
	for(int i=n-1;i>=0;i--){
		int w=get(x/fac[i]);
		ret.push_back(w);
		vis[w]=1;
		x%=fac[i];
	}
	return ret;
}
int solve(int n,int m)
{
	f[0]=1;
	for(int i=1;i<=m;i++)
	{
		memcpy(t,f,fac[n]*sizeof(int));
		memset(f,0,fac[n]*sizeof(int));
		for(int i=0;i<fac[n];i++)
			for(int j:to[i])
				add(f[j],t[i]);
	}
	return f[0];
}
void work()
{
	scanf("%d%d",&n,&m);
	fac[0]=1;
	for(int i=1;i<=n;i++) fac[i]=1ll*fac[i-1]*i%MOD;
	for(int i=0;i<fac[n];i++){
		vector<int> a=change(i);
		id[a]=i;
		rid[i]=a;
	}
	for(int i=0;i<fac[n];i++){
		vector<int> a=change(i);
		int w=a.front();
		a.erase(a.begin());
		for(int j=0;j<n;j++){
			vector<int> arr=a;
			arr.insert(arr.begin()+j,w);
			to[i].push_back(id[arr]);
		}
	}
	printf("%d",solve(n,m));
	return;
}
int main()
{
	freopen("input.in","r",stdin);
//	freopen("output.out","w",stdout);
	openfile("drama");
	work();
	return 0;
}
